home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 335_02 / as6809.y < prev    next >
Text File  |  1990-12-02  |  51KB  |  2,204 lines

  1. %{
  2.  
  3. /*
  4. HEADER:     ;
  5. TITLE:         Frankenstein Cross Assemblers;
  6. VERSION:     2.0;
  7. DESCRIPTION: "    Reconfigurable Cross-assembler producing Intel (TM)
  8.         Hex format object records.  ";
  9. KEYWORDS:     cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 
  10.         6811, tms7000, 8048, 8051, 8096, z8, z80;
  11. SYSTEM:     UNIX, MS-Dos ;
  12. FILENAME:     as6809.y;
  13. WARNINGS:     "This software is in the public domain.  
  14.         Any prior copyright claims are relinquished.  
  15.  
  16.         This software is distributed with no warranty whatever.  
  17.         The author takes no responsibility for the consequences 
  18.         of its use.
  19.  
  20.         Yacc (or Bison) required to compile."  ;
  21. SEE-ALSO:     as6809.doc,frasmain.c;    
  22. AUTHORS:     Mark Zenier;
  23. COMPILERS:     Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285)
  24.         (previous versions Xenix, Unisoft 68000 Version 7, Sun 3);
  25. */
  26. /* 6809 instruction generation file */
  27. /* November 17, 1990 */
  28.  
  29. /*
  30.     description    frame work parser description for framework cross
  31.             assemblers
  32.     history        February 2, 1988
  33.             September 11, 1990 - merge table definition
  34.             September 12, 1990 - short file names
  35.             September 14, 1990 - short variable names
  36.             September 17, 1990 - use yylex as external
  37. */
  38. #include <stdio.h>
  39. #include "frasmdat.h"
  40. #include "fragcon.h"
  41.  
  42. #define yylex lexintercept
  43.  
  44.     /* select criteria for ST_EXP  0000.0000.0000.00xx */
  45. #define    ADDR    0x3
  46. #define    DIRECT    0x1
  47. #define    EXTENDED    0x2
  48. #define ST_INH 0x1
  49. #define ST_IMM 0x2
  50. #define ST_EXP 0x4
  51. #define ST_IND 0x8
  52. #define ST_PCR 0x10
  53. #define ST_IPCR 0x20
  54. #define ST_IEXPR 0x40
  55. #define ST_SPSH 0x1
  56. #define ST_UPSH 0x1
  57. #define ST_TFR 0x1
  58.     
  59.     static char    genbdef[] = "[1=];";
  60.     static char    genwdef[] = "[1=]x"; /* x for normal, y for byte rev */
  61.     char ignosyn[] = "[Xinvalid syntax for instruction";
  62.     char ignosel[] = "[Xinvalid operands";
  63. #define    IDM000    0
  64. #define    IDM100    1
  65. #define    IDM101    2
  66. #define    IDM102    3
  67. #define    IDM103    4
  68. #define    IDM104    5
  69. #define    IDM105    6
  70. #define    IDM106    7
  71. #define    IDM108    8
  72. #define    IDM109    9
  73. #define    IDM10B    10
  74. #define    IDM111    11
  75. #define    IDM113    12
  76. #define    IDM114    13
  77. #define    IDM115    14
  78. #define    IDM116    15
  79. #define    IDM118    16
  80. #define    IDM119    17
  81. #define    IDM11B    18
  82.     char *(indexgen [] [4]) = {
  83. /*IDM000;*/ { "[1=].5R.00|;", "[1=].5R.20|;", "[1=].5R.40|;", "[1=].5R.60|;"},
  84. /*IDM100;*/ { "80;", "a0;", "c0;", "e0;" },
  85. /*IDM101;*/ { "81;", "a1;", "c1;", "e1;" },
  86. /*IDM102;*/ { "82;", "a2;", "c2;", "e2;" },
  87. /*IDM103;*/ { "83;", "a3;", "c3;", "e3;" },
  88. /*IDM104;*/ { "84;", "a4;", "c4;", "e4;" },
  89. /*IDM105;*/ { "85;", "a5;", "c5;", "e5;" },
  90. /*IDM106;*/ { "86;", "a6;", "c6;", "e6;" },
  91. /*IDM108;*/ { "88;[1=]r", "a8;[1=]r", "c8;[1=]r", "e8;[1=]r" },
  92. /*IDM109;*/ { "89;[1=]x", "a9;[1=]x", "c9;[1=]x", "e9;[1=]x" },
  93. /*IDM10B;*/ { "8B;", "aB;", "cB;", "eB;" },
  94. /*IDM111;*/ { "91;", "B1;", "D1;", "F1;" },
  95. /*IDM113;*/ { "93;", "B3;", "D3;", "F3;" },
  96. /*IDM114;*/ { "94;", "B4;", "D4;", "F4;" },
  97. /*IDM115;*/ { "95;", "B5;", "D5;", "F5;" },
  98. /*IDM116;*/ { "96;", "B6;", "D6;", "F6;" },
  99. /*IDM118;*/ { "98;[1=]r", "b8;[1=]r", "d8;[1=]r", "f8;[1=]r" },
  100. /*IDM119;*/ { "99;[1=]x", "b9;[1=]x", "d9;[1=]x", "f9;[1=]x" },
  101. /*IDM11B;*/ { "9B;", "BB;", "DB;", "FB;" }
  102.         };
  103.  
  104. #define    PCRNEG8M    -126
  105. #define    PCRPLUS8M    129
  106. #define    PCR8STR        "8c;[1=].Q.1+-r"
  107. #define    IPCR8STR    "9c;[1=].Q.1+-r"
  108. #define    PCR16STR    "8d;[1=].Q.2+-.ffff&x"
  109. #define    IPCR16STR    "9d;[1=].Q.2+-.ffff&x"
  110. #define    IEXPSTR        "9f;[1=]x"
  111. #define    TFRD    0
  112. #define    TFRX    1
  113. #define    TFRY    2
  114. #define    TFRU    3
  115. #define    TFRS    4
  116. #define    TFRPC    5
  117. #define    TFRA    0x8
  118. #define    TFRB    0x9
  119. #define    TFRCC    0xa
  120. #define    TFRDP    0xb
  121. #define    TFR8BIT    0x8
  122. #define    REGBUSTK 0x100
  123. #define    REGBSSTK 0x200
  124. #define    PPOSTCC    0x01
  125. #define    PPOSTA    0x02
  126. #define    PPOSTB    0x04
  127. #define    PPOSTDP    0x08
  128. #define    PPOSTX    0x10
  129. #define    PPOSTY    0x20
  130. #define    PPOSTS    (0x40|REGBSSTK)
  131. #define    PPOSTU    (0x40|REGBUSTK)
  132. #define    PPOSTPC    0x80
  133.  
  134.     long    labelloc;
  135.     static int satsub;
  136.     int    ifstkpt = 0;
  137.     int    fraifskip = FALSE;
  138.  
  139.     struct symel * endsymbol = SYMNULL;
  140.  
  141. %}
  142. %union {
  143.     int    intv;
  144.     long     longv;
  145.     char    *strng;
  146.     struct symel *symb;
  147. }
  148.  
  149. %token <intv> ACCUM
  150. %token <intv> INDEX
  151. %token <intv> SPECREG
  152. %token  PCRELATIVE
  153. %type <intv> regbits register
  154. %type <strng> indexed
  155. %token <intv> KOC_BDEF
  156. %token <intv> KOC_ELSE
  157. %token <intv> KOC_END
  158. %token <intv> KOC_ENDI
  159. %token <intv> KOC_EQU
  160. %token <intv> KOC_IF
  161. %token <intv> KOC_INCLUDE
  162. %token <intv> KOC_ORG
  163. %token <intv> KOC_RESM
  164. %token <intv> KOC_SDEF
  165. %token <intv> KOC_SET
  166. %token <intv> KOC_WDEF
  167. %token <intv> KOC_CHSET
  168. %token <intv> KOC_CHDEF
  169. %token <intv> KOC_CHUSE
  170. %token <intv> KOC_opcode
  171. %token <intv> KOC_sstkop
  172. %token <intv> KOC_ustkop
  173. %token <intv> KOC_tfrop
  174.  
  175. %token <longv> CONSTANT
  176. %token EOL
  177. %token KEOP_AND
  178. %token KEOP_DEFINED
  179. %token KEOP_EQ
  180. %token KEOP_GE
  181. %token KEOP_GT
  182. %token KEOP_HIGH
  183. %token KEOP_LE
  184. %token KEOP_LOW
  185. %token KEOP_LT
  186. %token KEOP_MOD
  187. %token KEOP_MUN
  188. %token KEOP_NE
  189. %token KEOP_NOT
  190. %token KEOP_OR
  191. %token KEOP_SHL
  192. %token KEOP_SHR
  193. %token KEOP_XOR
  194. %token KEOP_locctr
  195. %token <symb> LABEL
  196. %token <strng> STRING
  197. %token <symb> SYMBOL
  198.  
  199. %token KTK_invalid
  200.  
  201. %right    KEOP_HIGH KEOP_LOW
  202. %left    KEOP_OR KEOP_XOR
  203. %left    KEOP_AND
  204. %right    KEOP_NOT
  205. %nonassoc    KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ
  206. %left    '+' '-'
  207. %left    '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR
  208. %right    KEOP_MUN
  209.  
  210.  
  211. %type <intv> expr exprlist stringlist
  212.  
  213. %start file
  214.  
  215. %%
  216.  
  217. file    :    file allline
  218.     |    allline
  219.     ;
  220.  
  221. allline    :     line EOL
  222.             {
  223.                 clrexpr();
  224.             }
  225.     |    EOL
  226.     |    error EOL
  227.             {
  228.                 clrexpr();
  229.                 yyerrok;
  230.             }
  231.     ;
  232.  
  233. line    :    LABEL KOC_END 
  234.             {
  235.                 endsymbol = $1;
  236.                 nextreadact = Nra_end;
  237.             }
  238.     |          KOC_END 
  239.             {
  240.                 nextreadact = Nra_end;
  241.             }
  242.     |    KOC_INCLUDE STRING
  243.             {
  244.         if(nextfstk >= FILESTKDPTH)
  245.         {
  246.             fraerror("include file nesting limit exceeded");
  247.         }
  248.         else
  249.         {
  250.             infilestk[nextfstk].fnm = savestring($2,strlen($2));
  251.             if( (infilestk[nextfstk].fpt = fopen($2,"r"))
  252.                 ==(FILE *)NULL )
  253.             {
  254.                 fraerror("cannot open include file");
  255.             }
  256.             else
  257.             {
  258.                 nextreadact = Nra_new;
  259.             }
  260.         }
  261.             }
  262.     |    LABEL KOC_EQU expr 
  263.             {
  264.                 if($1 -> seg == SSG_UNDEF)
  265.                 {
  266.                     pevalexpr(0, $3);
  267.                     if(evalr[0].seg == SSG_ABS)
  268.                     {
  269.                         $1 -> seg = SSG_EQU;
  270.                         $1 -> value = evalr[0].value;
  271.                         prtequvalue("C: 0x%lx\n",
  272.                             evalr[0].value);
  273.                     }
  274.                     else
  275.                     {
  276.                         fraerror(
  277.                     "noncomputable expression for EQU");
  278.                     }
  279.                 }
  280.                 else
  281.                 {
  282.                     fraerror(
  283.                 "cannot change symbol value with EQU");
  284.                 }
  285.             }
  286.     |    LABEL KOC_SET expr 
  287.             {
  288.                 if($1 -> seg == SSG_UNDEF
  289.                    || $1 -> seg == SSG_SET)
  290.                 {
  291.                     pevalexpr(0, $3);
  292.                     if(evalr[0].seg == SSG_ABS)
  293.                     {
  294.                         $1 -> seg = SSG_SET;
  295.                         $1 -> value = evalr[0].value;
  296.                         prtequvalue("C: 0x%lx\n",
  297.                             evalr[0].value);
  298.                     }
  299.                     else
  300.                     {
  301.                         fraerror(
  302.                     "noncomputable expression for SET");
  303.                     }
  304.                 }
  305.                 else
  306.                 {
  307.                     fraerror(
  308.                 "cannot change symbol value with SET");
  309.                 }
  310.             }
  311.     |    KOC_IF expr 
  312.             {
  313.         if((++ifstkpt) < IFSTKDEPTH)
  314.         {
  315.             pevalexpr(0, $2);
  316.             if(evalr[0].seg == SSG_ABS)
  317.             {
  318.                 if(evalr[0].value != 0)
  319.                 {
  320.                     elseifstk[ifstkpt] = If_Skip;
  321.                     endifstk[ifstkpt] = If_Active;
  322.                 }
  323.                 else
  324.                 {
  325.                     fraifskip = TRUE;
  326.                     elseifstk[ifstkpt] = If_Active;
  327.                     endifstk[ifstkpt] = If_Active;
  328.                 }
  329.             }
  330.             else
  331.             {
  332.                 fraifskip = TRUE;
  333.                 elseifstk[ifstkpt] = If_Active;
  334.                 endifstk[ifstkpt] = If_Active;
  335.             }
  336.         }
  337.         else
  338.         {
  339.             fraerror("IF stack overflow");
  340.         }
  341.             }
  342.                         
  343.     |    KOC_IF 
  344.             {
  345.         if(fraifskip) 
  346.         {
  347.             if((++ifstkpt) < IFSTKDEPTH)
  348.             {
  349.                     elseifstk[ifstkpt] = If_Skip;
  350.                     endifstk[ifstkpt] = If_Skip;
  351.             }
  352.             else
  353.             {
  354.                 fraerror("IF stack overflow");
  355.             }
  356.         }
  357.         else
  358.         {
  359.             yyerror("syntax error");
  360.             YYERROR;
  361.         }
  362.                 }
  363.                         
  364.     |    KOC_ELSE 
  365.             {
  366.                 switch(elseifstk[ifstkpt])
  367.                 {
  368.                 case If_Active:
  369.                     fraifskip = FALSE;
  370.                     break;
  371.                 
  372.                 case If_Skip:
  373.                     fraifskip = TRUE;
  374.                     break;
  375.                 
  376.                 case If_Err:
  377.                     fraerror("ELSE with no matching if");
  378.                     break;
  379.                 }
  380.             }
  381.  
  382.     |    KOC_ENDI 
  383.             {
  384.                 switch(endifstk[ifstkpt])
  385.                 {
  386.